package specctrl

import (
	"net/http"
	"strconv"
	"web_server/model/mainmodel"
	"web_server/model/specmodel"
	"web_server/utils"

	"github.com/gin-gonic/gin"
)

// 增加页面
func SpecAdd(ctx *gin.Context, user mainmodel.UserModel) {
	//渲染页面
	ctx.HTML(http.StatusOK, "spec-add.html", gin.H{
		"pubkey": utils.GetPubKeyString(),
	})
}

// 查看页面
func SpecLst(ctx *gin.Context, user mainmodel.UserModel) {
	//第几页
	pageStr := ctx.Query("page")
	var page int64 = 1
	if n, err := strconv.ParseInt(pageStr, 10, 64); err != nil && n > 0 {
		page = n
	}
	//获取对应页面数据及页面数量
	speclist, pagemax := specmodel.GetSpecList(page)
	if page > pagemax {
		page = pagemax
	}
	//页面渲染
	ctx.HTML(http.StatusOK, "spec-list.html", gin.H{
		"sl":      speclist,
		"page":    page,
		"last":    page - 1,
		"next":    page + 1,
		"pagemax": pagemax,
		"pubkey":  utils.GetPubKeyString(),
	})
}

// 编辑页面
func SpecEdt(ctx *gin.Context, user mainmodel.UserModel) {
	editIdStr := ctx.Query("id")
	editId := user.Id
	if id, err := strconv.ParseInt(editIdStr, 10, 64); err == nil && id != 0 {
		editId = id
	}
	if editSpec := specmodel.GetSpecModel(editId); editSpec != nil {
		ctx.HTML(http.StatusOK, "spec-edit.html", gin.H{
			"sm":     *editSpec,
			"pubkey": utils.GetPubKeyString(),
		})
	} else {
		ctx.String(http.StatusOK, "没有此水果种类!")
	}
}

// 增加请求处理
func SpecAddPost(ctx *gin.Context, user mainmodel.UserModel) {
	//获取传来的信息, 并且进行BASE64解密/RSA解密/json解析
	r := ctx.Request
	var jsdata specmodel.SpecModel
	if err := utils.B64RsaJsonDecrypt(r.FormValue("data"), &jsdata); err != nil {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "信息格式错误",
		})
		return
	}
	//数据合法性检测
	if len(jsdata.Name) < 2 || len(jsdata.Name) > 15 ||
		len(jsdata.Info) > 100 {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "信息格式错误",
		})
		return
	}
	//数据增加操作
	if err := specmodel.SetSpecAdd(jsdata); err != nil {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "创建失败: " + err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"status": true,
	})
}

// 编辑请求处理
func SpecEdtPost(ctx *gin.Context, user mainmodel.UserModel) {
	//获取传来的信息, 并且进行BASE64解密/RSA解密/json解析
	r := ctx.Request
	var jsdata specmodel.SpecModel
	if err := utils.B64RsaJsonDecrypt(r.FormValue("data"), &jsdata); err != nil {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "信息格式错误",
		})
		return
	}
	//数据合法性检测
	if len(jsdata.Name) < 2 || len(jsdata.Name) > 15 ||
		len(jsdata.Info) > 100 {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "信息格式错误",
		})
		return
	}
	//数据编辑操作
	if err := specmodel.SetSpecEdit(jsdata); err != nil {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "修改失败: " + err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"status": true,
	})
}

// 删除请求处理
func SpecDelPost(ctx *gin.Context, user mainmodel.UserModel) {
	//获取传来的信息, 并且进行BASE64解密/RSA解密/json解析
	r := ctx.Request
	data := r.FormValue("data")
	var jsdata struct {
		Ids []int `json:"id"`
	}
	if err := utils.B64RsaJsonDecrypt(data, &jsdata); err != nil || len(jsdata.Ids) == 0 || len(jsdata.Ids) >= 20 {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "信息格式错误",
		})
	}
	//数据删除操作
	if err := specmodel.SetSpecDel(jsdata.Ids); err != nil {
		ctx.JSON(0, gin.H{
			"status": false,
			"msg":    "删除失败: " + err.Error(),
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"status": true,
	})
}
